package d5_tcp02_2;

import java.io.DataOutputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.util.Scanner;

/*
//我们是上层调用者,只是面型程序进行开发, 你用了java.net.Socket-->底层自然是TCP通信
        //实际上是端到端的通信
 */
public class Client01 {
    public static void main(String[] args) throws Exception {
        //目标:TCP客户端开发。 改成多发多收
        //1、创建socket对象, 请求与服务器的socket管道连接。
        Socket socket = new Socket("127.0.0.1", 8848);

        //2、从socket管道中得到一个字节输出流, 往外写数据出去
        //注意这个不是普通的输出管道,因为是由socket对象得到的,所以是会流向接收端
        OutputStream os = socket.getOutputStream();//创建管道,就会得到这根管道,这个管道最终是会跟,服务端进行对接


        //3、把低级流包装成特殊输出流
        DataOutputStream dos = new DataOutputStream(os);
        //创建一个扫描器
        Scanner sc = new Scanner(System.in);

        while (true) {
            //提示用户进行输出
            System.out.println("请说:");
            //接受用户输出的数据-->数字
            int number = sc.nextInt();
            //接受用户输入的数据-->字符串
            String msg = sc.next();

            //加一个退出的机制
            if (msg.equals("exit")){
                //提示
                System.out.println("退出成功");
                //进行关闭管道
                socket.close();//会抛一个,关闭信号,但不是UTF-8格式,服务端是没有办法进行读取,所以报错
                //退出循环
                break;
            }
            //4、发数据出去服务器
            //通信是很严格的,别人用什么流发,你这边就用什么流接
            //别人发了什么数据类型,你就得用什么数据类型接
            dos.writeInt(number);
            dos.writeUTF(msg);
            dos.flush();//进行刷新, 不然可能在缓冲区
            //客户端先发的数据会缓冲的管道里面,直到服务端执行到读数据的哪一行,来读才会收到
        }

        //最后一步,释放资源,也没有报错
//        socket.close();
    }
}


